#!/usr/bin/env bash
set -euo pipefail

############################
# CONFIG
############################
VPS_HOST="50.28.69.47"
VPS_USER="anthro"
SSH_PORT="22"

BASE_DIR="$HOME/vps_backups"
MIRROR_DIR="$BASE_DIR/mirror"
ARCHIVE_DIR="$BASE_DIR/archives"
LOG_DIR="$BASE_DIR/logs"
STATE_FILE="$BASE_DIR/backup_run_state.json"

DATE="$(date -u +%Y-%m-%d_%H-%M-%S)"
LOG_FILE="$LOG_DIR/backup_$DATE.log"

############################
# PREP
############################
mkdir -p "$MIRROR_DIR" "$ARCHIVE_DIR" "$LOG_DIR"

exec > >(tee -a "$LOG_FILE") 2>&1

echo "[$(date -u)] Backup started"

############################
# LOAD / INIT STATE
############################
if [[ ! -f "$STATE_FILE" ]]; then
  echo '{}' > "$STATE_FILE"
fi

LAST_FULL=$(jq -r '.last_full_backup // empty' "$STATE_FILE")
NOW_EPOCH=$(date +%s)

FULL_INTERVAL=$((7*24*60*60)) # 7 days
DO_FULL=false

if [[ -z "$LAST_FULL" ]]; then
  DO_FULL=true
elif (( NOW_EPOCH - LAST_FULL > FULL_INTERVAL )); then
  DO_FULL=true
fi

############################
# RSYNC MIRROR (ALWAYS RUNS)
############################
echo "[$(date -u)] Starting rsync mirror"

rsync -aAXH --numeric-ids \
  --delete \
  --rsync-path="sudo rsync" \
  --info=progress2 \
  --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} \
  -e "ssh -p $SSH_PORT -o BatchMode=yes" \
  "$VPS_USER@$VPS_HOST:/" \
  "$MIRROR_DIR/"

echo "[$(date -u)] Rsync mirror complete"

############################
# WEEKLY FULL BACKUP (7z)
############################
if [[ "$DO_FULL" == true ]]; then
  ARCHIVE="$ARCHIVE_DIR/vps_full_$DATE.7z"
  echo "[$(date -u)] Creating full archive $ARCHIVE"

  7z a -t7z -mx=3 -mmt=on "$ARCHIVE" "$MIRROR_DIR"

  echo "[$(date -u)] Verifying archive"
  7z t "$ARCHIVE"

  jq --argjson t "$NOW_EPOCH" \
     '.last_full_backup=$t' \
     "$STATE_FILE" > "$STATE_FILE.tmp" && mv "$STATE_FILE.tmp" "$STATE_FILE"
fi

############################
# UPDATE STATE
############################
jq --arg d "$DATE" \
   '.last_run=$d' \
   "$STATE_FILE" > "$STATE_FILE.tmp" && mv "$STATE_FILE.tmp" "$STATE_FILE"

echo "[$(date -u)] Backup finished successfully"
